package Talk;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;



public class ChatGameServer {
    private ServerSocket serverSocket;
    /*在这个地方我需要找寻怎么让多台设备进行交流*/
    private List<Socket> clients = new ArrayList<>();
    private List<DataOutputStream> outputs = new ArrayList<>();

    public ChatGameServer() {
        try {
            serverSocket = new ServerSocket(8888);
            System.out.println("服务器启动，等待客户端连接...");
            while (true) {
                //向客户端发送消息
                Socket clientSocket = serverSocket.accept();//接收到的是一个Socket类型的对象。
                clients.add(clientSocket);//添加Sockt对像
                DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
                outputs.add(out);//添加流道
                System.out.println("新客户端连接：" + clientSocket.getInetAddress());
                //线程问题的内容是读取客户端发送的消息
                new Thread(() -> handleClient(clientSocket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {//是否连接成功
                if (serverSocket!= null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void handleClient(Socket clientSocket) {
        try (DataInputStream in = new DataInputStream(clientSocket.getInputStream())) {
            while (true) {
                String message = in.readUTF();//从输入流中读取以 UTF-8 格式编码的字符串
                System.out.println("收到消息：" + message);
                //增强版for循环
                //
                for (DataOutputStream out : outputs) {
                    out.writeUTF(message);//“out.writeUTF (message)” 的作用是使用数据输出流（假设 “out” 是一个DataOutputStream对象）
                    // 将字符串 “message” 以 UTF-8 编码格式写入到输出流中。，客户端传过来的信息，告诉他
                }
            }
            //比如在读取文件、写入文件、进行网络通信等过程中，如果出现了文件找不到、
            // 网络连接中断、磁盘空间不足等问题，就可能抛出 “IOException” 异常。
        } catch (IOException e) {
            System.out.println("客户端断开连接：" + clientSocket.getInetAddress());
            clients.remove(clientSocket);
            //outputs.removeIf引入的一种集合操作方法，用于根据给定的条件删除集合中的元素。

            outputs.removeIf(output -> output.toString().contains(clientSocket.toString()));
        }
    }

    public static void main(String[] args) {
        new ChatGameServer();
    }
}